package com.ztk.threadbasic.my_main;

import lombok.Data;

import java.util.*;
import java.util.function.Function;  
import java.util.stream.Collectors;  

@Data
public class AccountMerger {  
  
    static class Account {  
        String unitAccount;  
        double unitBalance; // 账户余额  
        double tempBalance; // 暂存余额  
  
        Account(String unitAccount, double unitBalance, double tempBalance) {  
            this.unitAccount = unitAccount;  
            this.unitBalance = unitBalance;  
            this.tempBalance = tempBalance;  
        }

        public String getUnitAccount() {
            return unitAccount;
        }

        public void setUnitAccount(String unitAccount) {
            this.unitAccount = unitAccount;
        }

        public double getUnitBalance() {
            return unitBalance;
        }

        public void setUnitBalance(double unitBalance) {
            this.unitBalance = unitBalance;
        }

        public double getTempBalance() {
            return tempBalance;
        }

        public void setTempBalance(double tempBalance) {
            this.tempBalance = tempBalance;
        }

        @Override
        public String toString() {  
            return "Account{" +  
                    "unitAccount='" + unitAccount + '\'' +  
                    ", unitBalance=" + unitBalance +  
                    ", tempBalance=" + tempBalance +  
                    '}';  
        }  
    }  
  
    public static void main(String[] args) {  
        List<Account> listA = Arrays.asList(  
                new Account("A001", 1000, 0), // 假设这里暂存余额初始为0  
                new Account("A002", 2000, 0)  
        );  
  
        List<Account> listB = Arrays.asList(  
                new Account("A001", 0, 500) // 这里账户余额初始为0，只关心暂存余额
                // 假设A003在A中不存在，我们可以选择忽略它或进行其他处理  
        );  
  
        // 创建一个Map来存储以unitAccount为键，Account为值的映射  
        Map<String, Account> accountMap = listA.stream()  
                .collect(Collectors.toMap(Account::getUnitAccount, Function.identity()));  
  
        // 遍历listB，将暂存余额合并到accountMap中对应的Account对象中  
        listB.forEach(bAccount -> {  
            accountMap.merge(bAccount.getUnitAccount(), bAccount, (existing, temp) -> {  
                // 如果已存在，则合并暂存余额，否则直接添加  
                existing.setTempBalance(existing.getTempBalance() + temp.getTempBalance());  
                return existing; // 返回已存在的Account对象  
            });  
        });  
  
        // 如果listB中有在listA中不存在的账户，您可以选择将它们添加到accountMap中  
        // 但在这个例子中，我们假设只关心listA中的账户  
  
        // 打印合并后的结果（这里我们直接打印accountMap的values）  
        accountMap.values().forEach(System.out::println);  
    }  
}